
/**
 * sparseArray 稀疏数组
 * 
 * JavaScript 数组的长度和元素类型都是非固定的。
 * 因为数组的长度可随时改变，并且其数据在内存中也可以不连续，
 * 所以 JavaScript 数组不一定是密集型的(稀疏)，这取决于它的使用方式。
 * 
 * 稀疏数组: 指索引不连续，数组长度大于元素个数的数组，通俗地说就是 有空隙的数组
 * 
 * 特性：
 * 访问速度慢
 * 内存利用率高
 * 
 */

// const arr = [1,,,,,2,3,,4,,,5,,,,,];
// console.log(arr);
// 稀疏数组间的空隙 , 叫为 empty: 是一个占位的名称，不是数据(默认为undefined)

// 一般占位使用 null (后续会赋值为对象、数组、fn，一个引用值时)
// empty -> 类型和值都为 undefined

// 访问稀疏数组的缺失元素时会返回 undefined，是因为 JS 引擎在发现元素缺失时会临时赋值 undefined，类似于 JS 变量的声明提升

// 构造函数声明一个没有元素的数组
// var a = new Array(6);
// console.log(a); // [empty × 6]
// console.log(a[2]); // undefined

// 指定的索引值大于数组长度
// var a = new Array();
// var a = [];
// a[5] = 3
// console.log(a); // [empty × 5, 3]

// 指定大于元素个数的数组长度
// var a = [];
// a.length = 5;
// console.log(a); // [empty × 5]

// 数组直接量中省略值
// var a = [0,,,];   
// console.log(a); // [0, empty × 2]

// 删除数组元素
// var a = [0, 1, 2, 3, 4];
// delete a[4];
// console.log(a); // [0, 1, 2, 3, empty]

// 转换为密集数组
// var a = new Array(3);
// var newArr = Array.apply(null, a); // ES5
// var newArr = Array.from(a); // ES6

// console.log(newArr); //  [undefined, undefined, undefined]


// 遍历稀疏数组

// const arr = [1,,,,,2,3,,4,,,5,,,,,];
// arr.find(item => {
  // console.log(item); // 1, undefined..., 2, (值全都打印出来，默认值为undefined)
// })

// arr.forEach(item => {
//   console.log(item); // 1, 2, 3, 4, 5
// })
// arr.map(item => {
//   console.log(item); // 1, 2, 3, 4, 5
// })

// forEach、map、filter 等方法，在遍历到稀疏数组的缺失元素时，回调函数不会执行

// var arr = [1,,,,3];
// for (let i in arr) { console.log(arr[i]) }; // 1 3
// for (let i of arr) { console.log(i) }; // 1 undefined undefined undefined 3

// sort: 不会遍历缺失元素，数组能正常排序，同时会返回与源数组相同的长度
// var a = [5,,,,1];
// console.log(a.sort());    // [1, 5, empty × 3]

// join: 缺失元素占的坑还是会被保留。
// var a = new Array(5);
// console.log(a.join()); // ',,,,'

// JSON.stringify: 在序列化时会被填充为 null
// var a = new Array(5);
// console.log(JSON.stringify(a)); // [null,null,null,null,null]
